{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "简化代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "截距: [4.11447415]\n",
      "系数: [[2.75822598]]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAisAAAGdCAYAAADT1TPdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAyhklEQVR4nO3de3wU1f3/8fewkIA0CaICgV0IWAWVihesgKZCFawXSpuCrVp+XtpHbcVCar9arbVFq1L7sBpata2Xoi0FbXFRW7WKfgWCoAUFS8UbFDGEUHqRLBcNspnfH+ebwLKzIZvMzM7svp6PRx64Z06yn3HZ7Jsz55yxbNu2BQAAEFBdcl0AAABAWwgrAAAg0AgrAAAg0AgrAAAg0AgrAAAg0AgrAAAg0AgrAAAg0AgrAAAg0LrmuoADNTc3a8uWLSopKZFlWbkuBwAAtINt29qxY4f69++vLl3cHQsJXFjZsmWLYrFYrssAAAAdUFdXp2g06urPDFxYKSkpkWROtrS0NMfVAACA9kgkEorFYq2f424KXFhpufRTWlpKWAEAIGS8mMLBBFsAABBohBUAABBohBUAABBohBUAABBohBUAABBohBUAABBohBUAABBohBUAABBogdsUDgCQf5JJqbZWamiQysulykopEsl1VQgLwgoAwFPxuDRjhrR58762aFSaPVuqqspdXQgPLgMBADwTj0uTJ6cGFUmqrzft8Xhu6kK4EFYAAJ5IJs2Iim2nH2tpq642/YC2EFYAAJ6orU0fUdmfbUt1daYf0BbCCgDAEw0N7vZD4SKsAAA8UV7ubj8ULsIKAMATlZVm1Y9lOR+3LCkWM/2AthBWAACeiETM8mQpPbC0PK6pYb8VHBxhBQDgmaoqacECacCA1PZo1LSzzwrag03hAACeqqqSJk1iB1t0HGEFAOC5SEQaOzbXVSCsuAwEAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACjbACAAACLeuwsnTpUk2cOFH9+/eXZVl6/PHHU47btq2ZM2eqf//+6tGjh8aOHas33njDrXoBAECByTqs7Nq1SyNGjNDdd9/tePynP/2p7rzzTt19991auXKl+vXrp/Hjx2vHjh2d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btaOHTvUu3fvlPadO3dq0KBBikajOv/889P+ZZZLnTnvE088UeXl5TrzzDP14osvphxbsWJF2s88++yz2/3/0mtuvN4PPvigzjrrLA0aNCilPcivd0dkei1XrVqljz/+uM0+QXm93RDG93dnhPn97YZ8eX83NjZKUtrf2/359R4nrLjg3//+t5LJpPr27ZvS3rdvX23durVdP+NnP/uZdu3apQsuuKC1bdiwYXrooYf05JNPav78+erevbtOO+00vfvuu67W31EdOe/y8nLdd999euyxxxSPxzV06FCdeeaZWrp0aWufrVu3dur/pdc6+3o3NDTomWee0de//vWU9qC/3h2R6bXcu3ev/v3vf7fZJyivtxvC+P7uiHx4f3dWvry/bdvW1VdfrdNPP13Dhw/P2M+v93jg7rocZpZlpTy2bTutzcn8+fM1c+ZMPfHEE+rTp09r+6hRozRq1KjWx6eddppOOukk/eIXv9DPf/5z9wrvpGzOe+jQoRo6dGjr49GjR6uurk533HGHPvOZz3ToZ+ZKR2t86KGH1KtXL33hC19IaQ/L650tp/9PB7aH4fXuqLC/v7ORT+/vjsqX9/dVV12lv/3tb1q2bNlB+/rxHmdkxQWHH364IpFIWkrctm1bWpo80KOPPqqvfe1r+sMf/qCzzjqrzb5dunTRKaecEpgk3pnz3t+oUaNSzqlfv36d/ple6sx527at3/zmN5o6daqKiora7Bu017sjMr2WXbt21WGHHdZmn6C83p0R5ve3W8L2/u6MfHl/f/vb39aTTz6pF198UdFotM2+fr3HCSsuKCoq0sknn6xFixaltC9atEhjxozJ+H3z58/XpZdeqnnz5um888476PPYtq01a9aovLy80zW7oaPnfaDVq1ennNPo0aPTfuZzzz2X1c/0UmfOe8mSJVq/fr2+9rWvHfR5gvZ6d0Sm13LkyJHq1q1bm32C8np3VNjf324J2/u7M8L+/rZtW1dddZXi8bj+93//V4MHDz7o9/j2Hm/3VFy06ZFHHrG7detmP/jgg/a6devs6upqu2fPnq2zwa+77jp76tSprf3nzZtnd+3a1b7nnnvshoaG1q/t27e39pk5c6b9l7/8xd6wYYO9evVq+7LLLrO7du1qv/LKK76fXybZnvddd91lL1y40H7nnXfsv//97/Z1111nS7Ife+yx1j4vvfSSHYlE7J/85Cf2m2++af/kJz+xu3btar/88su+n18m2Z53i69+9av2qaee6vgzw/B679ixw169erW9evVqW5J955132qtXr7Y3bdpk23b6ef/jH/+wDznkEPs73/mOvW7dOvvBBx+0u3XrZi9YsKC1Txhe72zPO1/e39med768v7M97xZhf39/61vfssvKyuzFixen/L3dvXt3a59cvccJKy6655577EGDBtlFRUX2SSedlLLc65JLLrHPOOOM1sdnnHGGLSnt65JLLmntU11dbQ8cONAuKiqyjzjiCHvChAn28uXLfTyj9snmvG+//Xb7yCOPtLt3724feuih9umnn24/9dRTaT/zj3/8oz106FC7W7du9rBhw1J+2QVFNudt27a9fft2u0ePHvZ9993n+PPC8Hq3LE3N9PfW6bwXL15sn3jiiXZRUZFdUVFh//KXv0z7uUF/vbM973x5f2d73vny/u7I3/N8eH87nbMke86cOa19cvUet/6vQAAAgEBizgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAg0wgoAAAi0/w99t/ODmMnVLwAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 生成简单的线性数据\n",
    "X = 2 * np.random.rand(100, 1)\n",
    "y = 4 + 3 * X + np.random.randn(100, 1)\n",
    "\n",
    "# 拆分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 创建模型并训练\n",
    "model = LinearRegression()\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 预测\n",
    "y_pred = model.predict(X_test)\n",
    "\n",
    "# 输出模型参数\n",
    "print(\"截距:\", model.intercept_)\n",
    "print(\"系数:\", model.coef_)\n",
    "\n",
    "# 可视化\n",
    "plt.scatter(X_test, y_test, color='blue')\n",
    "plt.plot(X_test, y_pred, color='red')\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1.数据处理\n",
    "2.机器学习"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "截距（b0）: [4.20634019]\n",
      "回归系数（b1）: [[2.9902591]]\n",
      "[[7.19659929]]\n",
      "均方误差: 0.9177532469714291\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 导入必要的库\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.metrics import mean_squared_error\n",
    "\n",
    "# 生成一些随机数据（作为示例）\n",
    "np.random.seed(0)\n",
    "X = 2 * np.random.rand(100, 1)  # 生成100个随机样本, 保证是二维矩阵 (100, 1)\n",
    "y = 4 + 3 * X + np.random.randn(100, 1)  # y = 4 + 3 * X + 噪声\n",
    "\n",
    "# 将数据集拆分为训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "\n",
    "# 创建线性回归模型\n",
    "model = LinearRegression()\n",
    "\n",
    "# 使用训练集训练模型\n",
    "model.fit(X_train, y_train)\n",
    "\n",
    "# 使用测试集进行预测\n",
    "y_pred = model.predict(X_test)  # 确保 X_test 的形状为二维数组 (20, 1)\n",
    "\n",
    "# 输出模型的参数\n",
    "print(f\"截距（b0）: {model.intercept_}\")\n",
    "print(f\"回归系数（b1）: {model.coef_}\")\n",
    "\n",
    "#预测结果\n",
    "print(model.predict([[1]]))\n",
    "# 计算均方误差\n",
    "mse = mean_squared_error(y_test, y_pred)\n",
    "print(f\"均方误差: {mse}\")\n",
    "\n",
    "# 可视化拟合结果\n",
    "plt.scatter(X_test, y_test, color='blue', label='Actual Data')  # 真实值\n",
    "plt.plot(X_test, y_pred, color='red', label='Predicted Line')  # 拟合直线\n",
    "plt.xlabel('X')\n",
    "plt.ylabel('y')\n",
    "plt.title('Linear Regression Fit')\n",
    "plt.legend()\n",
    "plt.show()\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在随机下降算法框架下编写不同模型的代码即可，最后调用gradint_descent函数即可\n",
    "注：不同的模型需要不同的损失函数和"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "随即下降算法通用代码框架"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "# 梯度下降通用模型\n",
    "def gradient_descent(X, y, theta, learning_rate, iterations, compute_gradient, compute_loss=None):\n",
    "    \"\"\"\n",
    "    X: 特征矩阵，形状为 (m, n)\n",
    "    y: 目标值，形状为 (m, 1)\n",
    "    theta: 参数，形状为 (n, 1)\n",
    "    learning_rate: 学习率\n",
    "    iterations: 迭代次数\n",
    "    compute_gradient: 用于计算梯度的函数\n",
    "    compute_loss: 可选的，用于计算损失的函数（用于可视化或监控损失的变化）\n",
    "    \"\"\"\n",
    "    m = len(y)\n",
    "    loss_history = []\n",
    "    \n",
    "    for i in range(iterations):\n",
    "        # 计算当前梯度\n",
    "        gradients = compute_gradient(X, y, theta)\n",
    "        \n",
    "        # 参数更新\n",
    "        theta = theta - learning_rate * gradients\n",
    "        \n",
    "        # 可选：记录损失值\n",
    "        if compute_loss:\n",
    "            loss = compute_loss(X, y, theta)\n",
    "            loss_history.append(loss)\n",
    "            if i % 100 == 0:  # 每100次迭代打印一次损失\n",
    "                print(f\"Iteration {i}, Loss: {loss}\")\n",
    "    \n",
    "    return theta, loss_history\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性回归损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# 通用损失函数 (以均方误差为例)\n",
    "def compute_mse_loss(X, y, theta):\n",
    "    predictions = X.dot(theta)\n",
    "    errors = predictions - y\n",
    "    mse = (1 / (2 * len(y))) * np.sum(errors**2)\n",
    "    return mse\n",
    "\n",
    "# 通用梯度计算函数 (以均方误差的梯度为例)\n",
    "def compute_mse_gradient(X, y, theta):\n",
    "    m = len(y)\n",
    "    predictions = X.dot(theta)\n",
    "    gradients = (1 / m) * X.T.dot(predictions - y)\n",
    "    return gradients\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "逻辑回归损失函数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "# Sigmoid 函数\n",
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))\n",
    "\n",
    "# 交叉熵损失函数\n",
    "def compute_log_loss(X, y, theta):\n",
    "    predictions = sigmoid(X.dot(theta))\n",
    "    loss = -1 / len(y) * np.sum(y * np.log(predictions) + (1 - y) * np.log(1 - predictions))\n",
    "    return loss\n",
    "\n",
    "# 交叉熵损失的梯度\n",
    "def compute_log_gradient(X, y, theta):\n",
    "    predictions = sigmoid(X.dot(theta))\n",
    "    gradients = (1 / len(y)) * X.T.dot(predictions - y)\n",
    "    return gradients\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 0, Loss: 26.21155643187915\n",
      "Iteration 100, Loss: 0.49710479322860623\n",
      "Iteration 200, Loss: 0.49625382201825324\n",
      "Iteration 300, Loss: 0.49622066838277457\n",
      "Iteration 400, Loss: 0.4962193767250404\n",
      "Iteration 500, Loss: 0.49621932640236316\n",
      "Iteration 600, Loss: 0.4962193244418034\n",
      "Iteration 700, Loss: 0.4962193243654207\n",
      "Iteration 800, Loss: 0.49621932436244465\n",
      "Iteration 900, Loss: 0.49621932436232874\n",
      "梯度下降得到的参数： [[4.22215104]\n",
      " [2.96846754]]\n"
     ]
    }
   ],
   "source": [
    "\n",
    "# 生成线性数据\n",
    "np.random.seed(0)\n",
    "X = 2 * np.random.rand(100, 1)\n",
    "y = 4 + 3 * X + np.random.randn(100, 1)\n",
    "\n",
    "# 为特征矩阵添加偏置项\n",
    "X_b = np.c_[np.ones((100, 1)), X]\n",
    "\n",
    "# 初始化参数\n",
    "theta = np.random.randn(2, 1)\n",
    "\n",
    "# 设置学习率和迭代次数\n",
    "learning_rate = 0.1\n",
    "iterations = 1000\n",
    "\n",
    "# 调用通用梯度下降模型\n",
    "theta_final, loss_history = gradient_descent(\n",
    "    X_b, y, theta, learning_rate, iterations, \n",
    "    compute_gradient=compute_mse_gradient,\n",
    "    compute_loss=compute_mse_loss\n",
    ")\n",
    "\n",
    "print(\"梯度下降得到的参数：\", theta_final)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 0, Loss: 3.023365532971934\n",
      "Iteration 100, Loss: -inf\n",
      "Iteration 200, Loss: -inf\n",
      "Iteration 300, Loss: -inf\n",
      "Iteration 400, Loss: -inf\n",
      "Iteration 500, Loss: -inf\n",
      "Iteration 600, Loss: -inf\n",
      "Iteration 700, Loss: -inf\n",
      "Iteration 800, Loss: -inf\n",
      "Iteration 900, Loss: -inf\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\Gaona\\AppData\\Local\\Temp\\ipykernel_34376\\1110037069.py:7: RuntimeWarning: divide by zero encountered in log\n",
      "  loss = -1 / len(y) * np.sum(y * np.log(predictions) + (1 - y) * np.log(1 - predictions))\n"
     ]
    }
   ],
   "source": [
    "# 定义逻辑回归的梯度和损失函数\n",
    "def sigmoid(z):\n",
    "    return 1 / (1 + np.exp(-z))\n",
    "\n",
    "def compute_log_loss(X, y, theta):\n",
    "    predictions = sigmoid(X.dot(theta))\n",
    "    loss = -1 / len(y) * np.sum(y * np.log(predictions) + (1 - y) * np.log(1 - predictions))\n",
    "    return loss\n",
    "\n",
    "def compute_log_gradient(X, y, theta):\n",
    "    predictions = sigmoid(X.dot(theta))\n",
    "    gradients = (1 / len(y)) * X.T.dot(predictions - y)\n",
    "    return gradients\n",
    "\n",
    "# 调用通用梯度下降\n",
    "theta_final, loss_history = gradient_descent(\n",
    "    X_b, y, theta, learning_rate, iterations, \n",
    "    compute_gradient=compute_log_gradient,\n",
    "    compute_loss=compute_log_loss\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "系数： [[2.88013425]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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woQJEfUJEyaooqKiQ4/R2Nio+vp6nX766RH1gwcPasCAAQoEArr++ust/0pJNrGci6FDhyo3N1djx47Va6+9FvG99evXWx7zmmuu6fD5TQQnXhdPPfWUxo0bpwEDBkTUU+11Ea22/r7ffvttHTt27KTHJPNrwgleea+IhdfeK5zg1feKtA0W+/btUzgc1llnnRVRP+uss/Tpp5926DF++ctf6tChQ5o8eXJzraCgQM8884xWrlypsrIyZWVlafTo0froo48c7d9JnTkXubm5WrBggZYtW6ZQKKTBgwdr7NixWrt2bfMxn376aUznNxFifV3U1NToxRdf1F133RVRT8XXRbTa+vs+fvy49u3bd9Jjkvk14QSvvFd0hlffK2Ll5fcK13c3TTatt243DKND27mXlZVp1qxZev7559WnT5/m+ogRIzRixIjmr0ePHq1hw4bp17/+tf77v//bucbjIJpzMXjwYA0ePLj565EjR6qqqkqPPfaYrrjiik49ZjLpbN/PPPOMTjvtNN14440R9VR+XUTD7ry1rqfqa6KzvPheEQ2vv1d0lpffK9J2xOLMM8+U3++3JOLPPvvMkpxbW7Jkie688049++yzGjdu3EmP7dKliy655JKkTpuxnIsTjRgxIuLPefbZZ8f8mG6L5VwYhqE//OEPuvXWW5WRkXHSY1PhdRGttv6+u3btqjPOOOOkxyTzayIWXnuvcIoX3iti4fX3irQNFhkZGRo+fLhWrVoVUV+1apVGjRrV5s+VlZXp9ttv16JFizRx4sR2n8cwDG3evFm5ubkx9xwvnT0XrVVWVkb8OUeOHGl5zJdffjmqx3RbLOfi9ddf17Zt23TnnXe2+zyp8LqIVlt/31/+8pfVrVu3kx6TzK+JzvLie4VTvPBeEQvPv1ckZMpokli8eLHRrVs346mnnjLef/99o7S01OjRo0fzDN0HH3zQuPXWW5uPX7RokdG1a1fjt7/9rVFTU9P868CBA83HzJo1y/jrX/9qbN++3aisrDS+/vWvG127djXefPNN1/980Yj2XPzqV78yli9fbnz44YfGe++9Zzz44IOGJGPZsmXNx7zxxhuG3+83HnnkEWPLli3GI488YnTt2tXYsGGD63++aER7Lpp87WtfMy677DLbx0zF10V9fb1RWVlpVFZWGpKMuXPnGpWVlcYnn3xiGIb1POzYscM45ZRTjJkzZxrvv/++8dRTTxndunUzli5d2nxMqr4moj0XXn6viPZcePm9Itpz0cRr7xWtpXWwMAzD+O1vf2sMGDDAyMjIMIYNG2a8/vrrzd+bPn26ceWVVzZ/feWVVxqSLL+mT5/efExpaanRv39/IyMjw+jdu7cxYcIEo6KiwsU/UedFcy4effRRY9CgQUZWVpbRq1cv4/LLLzdeeOEFy2M+99xzxuDBg41u3boZBQUFEW8mySyac2EYhnHgwAGje/fuxoIFC2wfLxVfF03LBNt6vdudhzVr1hhDhw41MjIyjPz8fOPxxx+3PG4qviaiPRdefq+I9lx4+b2iM/+PePG9ojW2TQcAAI5J2zkWAADAeQQLAADgGIIFAABwDMECAAA4hmABAAAcQ7AAAACOIVgAAADHECwAAIBjCBYAAMAxBAsAAOAYggUAAHAMwQIAADjm/wOfWYW6QQBqnQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.linear_model import LinearRegression  #逻辑回归的apiLogisticRegression\n",
    "import  matplotlib.pyplot as plt\n",
    "\n",
    "X = 2*np.random.rand(100,1)\n",
    "y = 4+3*X+np.random.randn(100,1)\n",
    "\n",
    "X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)\n",
    "\n",
    "model = LinearRegression()\n",
    "model.fit(X_train,y_train)\n",
    "\n",
    "y_pred = model.predict(X_test)\n",
    "\n",
    "print('系数：',model.coef_)\n",
    "\n",
    "plt.scatter(X_test,y_test,color='blue')\n",
    "plt.plot(X_test,y_pred,color='orange')\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "base",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
